What is giget?
The giget npm package is a tool that allows users to quickly download GitHub repositories and gists without needing to clone or set up Git. It is designed to be a fast and straightforward way to fetch code from GitHub.
What are giget's main functionalities?
Download GitHub repositories
This command downloads the specified GitHub repository to the current directory.
npx giget owner/repo
Download GitHub gists
This command downloads the specified GitHub gist to the current directory.
npx giget gist <gist-id>
Download specific files or directories
This command downloads a specific file or directory from a GitHub repository.
npx giget owner/repo/path/to/file
Download specific branch, tag, or commit
This command downloads the repository as it is at the specified branch, tag, or commit.
npx giget owner/repo#ref
Other packages similar to giget
degit
Degit is a similar tool that provides a straightforward way to download the contents of a git repository without the full version history. It is faster than using git clone and is useful for scaffolding projects. Compared to giget, degit focuses on git repositories and does not have built-in support for gists.
download-git-repo
download-git-repo is a Node.js module that allows you to download GitHub, GitLab, and Bitbucket repositories. It is similar to giget in that it lets you download repositories, but it also supports other platforms besides GitHub and does not have a specific focus on gists.
✨ giget
Download templates and git repositories with pleasure!
Features
✔ Support popular git providers (GitHub, GitLab, Bitbucket, Sourcehut) out of the box.
✔ Built-in and custom template registry.
✔ Fast cloning using tarball gzip without depending on local git
and tar
.
✔ Works online and offline with disk cache support.
✔ Custom template provider support with programmatic usage.
✔ Support extracting with a subdir.
✔ Authorization support to download private templates
Usage (CLI)
npx giget@latest <template> [<dir>] [...options]
Arguments
- template: Template name or a a URI describing provider, repository, subdir, and branch/ref. (See Examples)
- dir: A relative or absolute path where to extract the template.
Options
--force
: Clone to exsiting directory even if exists.--offline
: Do not attempt to download and use cached version.--prefer-offline
: Use cache if exists otherwise try to download.--force-clean
: ⚠️ Remove any existing directory or file recusively before cloning.--shell
: ⚠️ Open a new shell with current working directory in cloned dir. (Experimental).--registry
: URL to a custom registry. (Can be overriden with GIGET_REGISTRY
environment variable).--no-registry
: Disable registry lookup and functionality.--verbose
: Show verbose debugging info.--cwd
: Set current working directory to resolve dirs relative to it.--auth
: Custom Authorization token to use for downloading template. (Can be overriden with GIGET_AUTH
environment variable).
Examples
npx giget@latest nuxt
npx giget@latest gh:unjs/template
npx giget@latest gh:unjs/template myProject
npx giget@latest gh:unjs/template
npx giget@latest gh:unjs/template/test
npx giget@latest gitlab:unjs/template
npx giget@latest bitbucket:unjs/template
npx giget@latest sourcehut:pi0/unjs-template
Template Registry
Giget has a built-in HTTP registry system for resolving templates. This way you can support template name shortcuts and meta-data. Default registry is served from unjs/giget/templates.
If you want to add your template to the built-in registry, just drop a PR to add it to the ./templates directory. Slugs are added on first-come first-served basis but this might change in the future.
Custom Registry
A custom registry should provide an endpoint with dynamic path /:template.json
that returns a JSON response with keys same as custom providers.
name
: (required) Name of the template.tar
(required) Link to the tar download link.defaultDir
: (optional) Default cloning directory.url
: (optional) Webpage of the template.subpath
: (optional) Subpath inside the tar file.headers
: (optional) Custom headers to send while downloading template.
Because of the simplicity, you can even use a github repository as template registry but also you can build something more powerful by bringing your own API.
Usage (Programmatic)
Install package:
npm install giget
yarn install giget
pnpm install giget
Import:
import { downloadTemplate } from 'giget'
const { downloadTemplate } = require('giget')
downloadTemplate(source, options?)
Example:
const { source, dir } = await downloadTemplate('github:unjs/template')
Options:
source
: (string) Input source in format of [provider]:repo[/subpath][#ref]
.dir
: (string) Destination directory to clone to. If not provided, user-name
will be used relative to the current directory.options
: (object) Options are usually inferred from the input string. You can customize them.
provider
: (string) Either github
, gitlab
, bitbucket
or sourcehut
. The default is github
.repo
: (string) Name of repository in format of {username}/{reponame}
.ref
: (string) Git ref (branch or commit or tag). The default value is main
.subdirpath
: (string) subdir of the repo to clone from. The default value is none.force
: (boolean) Extract to the exisiting dir even if already exsists.forceClean
: (boolean) ⚠️ Clean ups any existing directory or file before cloning.offline
: (boolean) Do not attempt to download and use cached version.preferOffline
: (boolean) Use cache if exists otherwise try to download.providers
: (object) A map from provider name to custom providers. Can be used to override built-ins too.registry
: (string or false) Set to false
to disable registry. Set to a URL string (without trailing slash) for custom registry. (Can be overriden with GIGET_REGISTRY
environment variable).cwd
: (string) Current working directory to resolve dirs relative to it.auth
: (string) Custom Authorization token to use for downloading template. (Can be overriden with GIGET_AUTH
environment variable).
Return value:
The return value is a promise that resolves to the resolved template.
dir
: (string) Path to extracted dir.source
: (string) Normalized version of the input source without provider.- [other provider template keys]
url
: (string) URL of repostiroy that can be opened in browser. Useful for logging.
Custom Providers
Using programmatic method, you can make your own custom template providers.
import type { TemplateProvider } from 'giget'
const rainbow: TemplateProvider = async (input, { auth }) => {
return {
name: 'rainbow',
version: input,
headers: { Authorization: auth },
url: `https://rainbow.template/?variant=${input}`,
tar: `https://rainbow.template/dl/rainbow.${input}.tar.gz`
}
}
const { source, dir } = await downloadRepo('rainbow:one', { providers: { rainbow } })
Custom Registry Providers
You can define additional custom registry providers using registryProvider
utility and register to providers
.
import { registryProvider } from 'giget'
const themes = registryProvider('https://raw.githubusercontent.com/unjs/giget/main/templates')
const { source, dir } = await downloadRepo('themes:test', { providers: { themes } })
Related projects
Giget wouldn't be possible without inspering from former projects. In comparation giget does not depend on any local command which increases stability and performance, supports custom template providers, auth and many more features out of the box.
💻 Development
- Clone this repository
- Enable Corepack using
corepack enable
(use npm i -g corepack
for Node.js < 16.10) - Install dependencies using
pnpm install
- Run interactive tests using
pnpm dev
License
Made with 💛
Published under MIT License.